package com.demo.java.OD401_450.OD406;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【内存冷热标记(C&D卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146252474
 */
public class OdMain {
    // 计算热内存页的方法
    public static List<Integer> hotColdMemory(List<Integer> pages, int threshold) {
        // 使用HashMap记录每个页面的访问次数
        Map<Integer, Integer> pageCounter = new HashMap<>();
        for (int page : pages) {
            pageCounter.put(page, pageCounter.getOrDefault(page, 0) + 1);  // 更新页面访问次数
        }

        // 用于存储所有符合条件的热页
        List<Integer> hotPages = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : pageCounter.entrySet()) {
            if (entry.getValue() >= threshold) {  // 如果访问次数大于等于阈值，视为热页
                hotPages.add(entry.getKey());
            }
        }

        // 对热页进行排序，首先按访问次数降序，其次按页面编号升序
        hotPages.sort((page1, page2) -> {
            int countComparison = Integer.compare(pageCounter.get(page2), pageCounter.get(page1));  // 比较访问次数
            if (countComparison != 0) {
                return countComparison;  // 如果访问次数不同，按次数排序
            }
            return Integer.compare(page1, page2);  // 如果访问次数相同，按页面编号排序
        });

        return hotPages;  // 返回排序后的热页
    }

    public static void main(String[] args) {
        // 创建扫描器获取输入
        Scanner scanner = new Scanner(System.in);

        // 获取页面访问序列的长度N
        int N = scanner.nextInt();
        List<Integer> pages = new ArrayList<>();

        // 读取页面访问序列
        for (int i = 0; i < N; i++) {
            pages.add(scanner.nextInt());
        }

        // 获取热页阈值
        int threshold = scanner.nextInt();

        // 计算热内存页
        List<Integer> hotPages = hotColdMemory(pages, threshold);

        // 输出结果：热页的数量和每个热页的页号
        System.out.println(hotPages.size());
        for (int page : hotPages) {
            System.out.println(page);
        }
    }
}
